package dealCode

import (
	"encoding/binary"
	"errors"
	"io"
)

const Msg_Header = "12345678"

// Encode 用于网络传输中的二进制编码。把content编码后写入w
func Encode(w io.Writer, content string) (err error) {
	// 写入头（占用8bit，即1字节）
	if err = binary.Write(w, binary.BigEndian, []byte(Msg_Header)); err != nil {
		return
	}

	// 写入数据长度（用32bit，即4字节）
	if err = binary.Write(w, binary.BigEndian, int32(len([]byte(content)))); err != nil {
		return
	}

	// 写入数据
	if err = binary.Write(w, binary.BigEndian, []byte(content)); err != nil {
		return
	}
	return
}

// Decode 用于网络传输中的二进制解码。从r中读取后，解码后返回
func Decode(r io.Reader) (buf []byte, err error) {
	//校验头是否正确
	headerSlice := make([]byte, len([]byte(Msg_Header)))
	_, err = io.ReadFull(r, headerSlice)
	if string(headerSlice) != Msg_Header {
		return nil, errors.New("Msg_Header错误")
	}
	//获取内容部分长度
	contentLenSlice := make([]byte, 4)
	if _, err = io.ReadFull(r, contentLenSlice); err != nil {
		return nil, errors.New("长度读取失败")
	}
	contentLen := binary.BigEndian.Uint32(contentLenSlice) //将[]byte类型转换为int32。注意：这里的数据来源于网络（大端模式），这里需要用大端模式转换

	//读取内容
	contentSlice := make([]byte, contentLen)
	if _, err = io.ReadFull(r, contentSlice); err != nil {
		return nil, errors.New("内容读取失败")
	}
	return contentSlice, nil

}
